Автоматически вызывает функции-члены по информации о типе для интерфейса. Вы можете описать интерфейс с помощью информации о типе и реализовать IDispatch::Invoke одним вызовом этой Displnvoke.
HRESULT Displnvoke ( void FAR* _this, ITypelnfo FAR* ptinfo, DISPID dispidMember, unsigned short wFlags, DISPPARAMS FAR*pparams, VARIANT FAR* pvarResult, EXCEPWFO pexeepinfo, unsigned int FAR* puArgErr );
Параметры
_this
Указатель на реализацию интерфейса
IDispatch, которую описывает ptinfo.
ptinfo
Указатель
на информацию о типе, описывающую интерфейс.
dispidMember
Задает
вызываемый член. Для определения значения DISPID используйте
GetlDsOfNames или документацию к объекту.
wFlags
Флаги,
описывающие контекст вызова Invoke:
Значение | Описание |
DISPATCH_METHOD | Член вызывается как метод. Если свойство имеет то же самое имя, то могут быть установлены и этот флаг, и флаг DISPATCH_PROPERTYGET. |
DISPATCH_PROPERTYGET | Член считывается как свойство или элемент данных. |
DISPATCH PROPERTYPUT | Член изменяется как свойство или элемент данных. |
DISPATCH_PROPERTYPUTREF | Член изменяется путем присваивания ссылки, а не значения. Данный флаг допустим только тогда, когда свойство допускает ссылку на объект. |
pparams
Указатель на структуру, содержащую массив аргументов,
массив DISPID для именованных аргументов и счетчик элементов в
массивах.
pvarResult
Указатель, по которому должен возвращаться
результат, или NULL, если вызывающий не ожидает возврата результата. Если
задано DISPATCH_PROPERTYPUT или DISPATCH_PROPERTYPUTREF, данный
аргумент игнорируется.
pexcepmfo
Указатель на структуру, содержащую
информацию об исключении. Если возвращается DISP_E_EXCEPTION, эта
структура должна быть заполнена.
puArgErr
Индекс в rgvarg,
соответствующий первому аргументу, который вызвал ошибку. Аргументы хранятся в
pdispparams->rgvarg в обратном порядке, так что первому аргументу
соответствует наибольший индекс массива. Значение параметра возвращается только
в том случае, если код возврата равен DISP_E_TYPEMISMATCH или
DISP_E_PARAMNOTFOUND.
Код возврата | Значение |
S_OK | Успех. |
DISP_E_BADPARAMCOUNT | Число аргументов в DISPPARAMS отличается от фактического числа аргументов метода или свойства. |
DISP_E_BADVARTYPE | Один из аргументов в DISPPARAMS имеет неверный тип варианта. |
DISP_E_EXCEPTION | Приложению необходимо возбудить исключение. В данном случае структура pexcepinfo должна быть заполнена. |
DISP_E_MEMBERNOTFOUND | Запрошенный член не существует. |
DISP_E_NONAMEDARGS | Данная реализация IDispatch не поддерживает именованные аргументы. |
DISP_E_OVERFLOW | Один из аргументов в DISPPARAMS невозможно привести к заданному типу. |
DISP_E_PARAMNOTFOUND | Один из DISPID параметров не соответствует ни одному из параметров метода. В данном случае puArgErr устанавливается на первый аргумент, вызвавший ошибку. |
DISP_E_PARAMNOTOPTIONAL | Не задан обязательный параметр. |
DISP_E_TYPEMISMATCH | Приведение типа для одного или нескольких аргументов невозможно. Индекс первого параметра в массиве rgvarg, имеющего неверный тип, возвращается в puArgErr. |
E_INVALIDARG | Один из параметров неверен. |
E_OUTOFMEMORY | Не хватает памяти для выполнения операции. |
Другие | Могут также возвращаться любые коды возврата ITypeInfo::Invoke. |
Комментарии
Параметр _this представляет собой указатель на
реализацию интерфейса, к которому выполняется обращение. Displnvoke
строит стековый фрейм, преобразует параметры по стандартным правилам приведения
типов, помещает их в стек и затем вызывает соответствующую функцию-член в
VTBL.
Пример
Следующий код из примера Lines (файл Lines.cpp)
реализует IDispatch::Invoke с помощью Displnvoke. Эта функция
использует m_bRaiseException для сигнализации о том, что во время вызова
Displnvoke произошла ошибка.
STDMETHODIMP CLines::Invoke ( DISPID dispidMember, REFIID riid, LCID Icid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) { return DispInvoke( this, m_ptinfo,dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }